package parseur;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import database.AppUtilInterface;

import beans.*;


public class ParagraphesHandler  extends DefaultHandler{
	//résultats de notre parsing
	private ArrayList<Paragraphe> lParagraphes;
	private Paragraphe paragraphe;
	private String titre, sousTitre, xpath;
	//flags nous indiquant la position du parseur
	private boolean inParagraphe, inDescription, inPresentation, inBalade;
	private boolean inRecit, inSection, inSousTitre, inTitre, inUselessBalise;
	//compteurs de balises pour le xpath
	private int nParagraphe, nDescription, nPresentation, nBalade;
	private int nRecit, nSection, nSousTitre, nTitre;
	//buffer nous permettant de récupérer les données 
	private StringBuffer buffer;
	//variables externes
	private AppUtilInterface dao;
	private String filepath;

	// simple constructeur
	public ParagraphesHandler(AppUtilInterface dao, String filepath){
		super();
		nParagraphe = 0;
		nDescription = 0;
		nPresentation = 0;
		nBalade = 0;
		nRecit = 0;
		nSection = 0;
		nSousTitre = 0;
		nTitre = 0;
		xpath = new String("");
		
		this.dao = dao;
		this.filepath = filepath;
	}
	//détection d'ouverture de balise
	public void startElement(String uri, String localName,
			String qName, Attributes attributes) throws SAXException{
		if(qName.equals("AUTEUR") || qName.equals("DATE") || qName.equals("COMPLEMENTS")
				|| qName.equals("INFO") || qName.equals("LISTE") || qName.equals("ITEM") || qName.equals("PHOTO")){
			// On ne fait rien pour ces balises
		}else {
			if(qName.equals("BALADE")){
				inBalade = true;
				lParagraphes = new ArrayList<Paragraphe>();
				
				// Maj du xpath
				nBalade++;
				xpath += "/BALADE[" + nBalade + "]";
			}else if(qName.equals("PRESENTATION")){
				inPresentation = true;
				
				// Maj du xpath
				nPresentation++;
				xpath += "/PRESENTATION[" + nPresentation + "]";
			}else if(qName.equals("TITRE")){
				inTitre = true;
				buffer = new StringBuffer();
				
				// Maj du xpath
				nTitre++;
				xpath += "/TITRE[" + nTitre + "]";
			}else if(qName.equals("DESCRIPTION")){
				inDescription = true;
				
				// Maj du xpath
				nDescription++;
				xpath += "/DESCRIPTION[" + nDescription + "]";
			}else if(qName.equals("P")){
				inParagraphe = true;
				buffer = new StringBuffer();
				paragraphe = new Paragraphe();
				
				// Maj du xpath
				nParagraphe++;
				xpath += "/P[" + nParagraphe + "]";
			}else if(qName.equals("RECIT")){
				inRecit = true;
				
				// Maj du xpath
				nRecit++;
				xpath += "/RECIT[" + nRecit + "]";
				nParagraphe = 0;
			}else if(qName.equals("SEC")){
				inSection = true;
				
				// Maj du xpath
				nSection++;
				xpath += "/SEC[" + nSection + "]";
				nParagraphe = 0;
			}else if(qName.equals("SOUS-TITRE")){
				inSousTitre = true;
				buffer = new StringBuffer();
				
				// Maj du xpath
				nSousTitre++;
				xpath += "/SOUS-TITRE[" + nSousTitre + "]";
			}else {
				//erreur, on lève une exception
				throw new SAXException(filepath + " : Balise "+qName+" inconnue.");
			}
		}
	}
	//détection fin de balise
	public void endElement(String uri, String localName, String qName)
			throws SAXException{
		if(qName.equals("AUTEUR") || qName.equals("DATE") || qName.equals("COMPLEMENTS")
				|| qName.equals("INFO") || qName.equals("LISTE") || qName.equals("ITEM") || qName.equals("PHOTO")){
			// On ne fait rien
		}else {
			if(qName.equals("BALADE")){
				inBalade = false;
				
				nPresentation = 0;
				nRecit = 0;
			}else if(qName.equals("PRESENTATION")){
				inPresentation = false;
				
				nDescription = 0;
			}else if(qName.equals("TITRE")){
				inTitre = false;
				
				// Enregistrement du titre
				titre = buffer.toString();
				buffer = null;
			}else if(qName.equals("DESCRIPTION")){
				inDescription = false;
				
				nParagraphe = 0;
			}else if(qName.equals("P")){
				inParagraphe = false;
				
				// Ajout du texte
				paragraphe.setTexte(buffer.toString());
				buffer = null;
				
				// Paragraphe dans la description ou non
				paragraphe.setInDescription(inDescription);
				
				// Ajout du titre au paragraphe
				paragraphe.setTitre(titre);
	
				// Ajout du sous-titre au paragraphe
				paragraphe.setSousTitre(sousTitre);
				
				//Ajout du xpath
				paragraphe.setXpath(xpath);
				
				//Ajout du filepath
				paragraphe.setFilepath(filepath);
				
				lParagraphes.add(paragraphe);
				paragraphe = null;
				
			}else if(qName.equals("RECIT")){
				inRecit = false;
				
				nSection = 0;
			}else if(qName.equals("SEC")){
				inSection = false;
				
				nParagraphe = 0;
			}else if(qName.equals("SOUS-TITRE")){
				inSousTitre = false;
	
				// Enregistrement du sous-titre
				sousTitre = buffer.toString();
				buffer = null;
	
			}else if(qName.equals("AUTEUR") || qName.equals("DATE") || qName.equals("COMPLEMENTS")
					|| qName.equals("INFO") || qName.equals("LISTE") || qName.equals("ITEM") || qName.equals("PHOTO")){
				// On ne fait rien
			}else {
				//erreur, on lève une exception
				throw new SAXException(filepath + " : Balise "+qName+" inconnue.");
			}
			
			// Maj du xpath
			if ((xpath.lastIndexOf("/") > -1))
				xpath = xpath.substring(0, xpath.lastIndexOf("/"));
		}
	}
	//détection de caractères
	public void characters(char[] ch,int start, int length)
			throws SAXException{
		String lecture = new String(ch,start,length);
		if(buffer != null) buffer.append(lecture);       
	}
	//début du parsing
	public void startDocument() throws SAXException {
		System.out.println("Début du parsing du fichier " + filepath + " (" + new Date() + ")");
	}
	//fin du parsing
	public void endDocument() throws SAXException {
		System.out.println("Fin du parsing");
		System.out.println("Insertions des paragraphes, termes et associations");
		
		// Création de la liste des descriptions
		ArrayList<ArrayList<String>> descriptionsList = new ArrayList<ArrayList<String>>();
		for(Paragraphe p : lParagraphes){
			if (p.isInDescription())
				descriptionsList.add(p.getListeTermes());
		}
		
		// Création des hashmap de termes
		for(Paragraphe p : lParagraphes){
			if (p.isInDescription())
				p.setTermeMap(null);
			else
				p.setTermeMap(descriptionsList);
		}
		
		try {
			// Insertion de tous les paragraphes dans la DB (filepath, xpath, longueur) (table Paragraphes)
			dao.insertParagraphes(lParagraphes);
			
			for(Paragraphe p : lParagraphes){
				//Récupération de la hashmap de termes de ce paragraphe
				HashMap<String, Terme> pHashmap = p.getTermeMap();

				//Récupération de l'id du paragraghe
				int idParagraphe = dao.getIdParagraphe(p.getFilepath(), p.getXpath());
				p.setId(idParagraphe);

				//Insertion des termes non existant dans la DB (table Termes)
				dao.insertTermes(pHashmap.keySet());
				
				//Pour chaque terme, récupération de l'id
				for (String s : pHashmap.keySet()) {
					Terme terme = pHashmap.get(s);
					
					//Récupération de l'id du terme
					terme.setId(dao.getIdterme(s));
				}
				
				// Insertion de tous les liens de ce paragraphe dans la table ApparaitDans
				dao.insertApparaitDans(p);
				
				//Insertion des positions (table APourPosition)
				dao.insertAPourPosition(p);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
